home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / cross / ava-0.2.5.lha / ava-0.2.5 / src / Object.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-03-23  |  4.9 KB  |  190 lines

  1. /* Object.h, Uros Platise, dec. 1998 */
  2.  
  3. #ifndef __Object
  4. #define __Object
  5.  
  6. #include <string.h>
  7. #include <stdarg.h>
  8. #include <stdio.h>
  9. #include "Global.h"
  10. #include "Segment.h"
  11. #include "Preproc.h"
  12. #include "Syntax.h"
  13.  
  14. /* Object Directives */
  15. #define OBJ_OPERAND_CODE    'o'
  16. #define OBJ_OPERAND_PCMARKER    'M'
  17. #define OBJ_OPERAND_QSTRING    'q'
  18. #define OBJ_INSTRUCTION        'i'
  19. #define OBJ_KEYWORD        'k'
  20. #define OBJ_SEGMENT        's'
  21. #define OBJ_ASMSOURCE        'R'
  22. #define OBJ_ASMREF        'l'    /* for listing purposes */
  23. #define OBJ_CREF        'c'
  24. #define OBJ_SEGMENT_INFO    'S'
  25. #define OBJ_SYMBOL_INFO        'Y'
  26. #define OBJ_LISTING_ENABLED    'L'
  27.  
  28. #define OBJ_TERMINATOR        'T'
  29. #define OBJ_ENDOFFILE        'E'
  30. #define OBJ_HEADERIDX        'H'
  31.  
  32. #define OBJ_COPY_OPERANDS    "c"    /* list of operands to be copied from 
  33.                                            pass1 to pass2 and to exe */
  34.  
  35. #define MAX_OPERANDS    5
  36.  
  37.  
  38. class TCRC{
  39. private:
  40.   /* The error correction functions */  
  41.   static const long int crc32_table[];
  42.   unsigned long crc32;
  43.  
  44. public:  
  45.   void Init(){crc32=0xffffffff;}
  46.   void Update(unsigned char byte);
  47.   inline unsigned long Val() const {return ~crc32;}
  48.   
  49.   TCRC(){Init();}
  50. };
  51.  
  52. /*
  53.   Universal Segment Output Block
  54.   Special features:
  55.    * mirror/copy segment
  56. */
  57. class TSegmentOutput{
  58. private:
  59.   typedef TPt<TSegmentOutput> PSOutput;
  60.   int CRef;
  61.   int segNo;        /* segment number */
  62.   long size;        /* segment size */
  63.   long used;        /* number of NIBBLES already in buffer. */
  64.   long addr;        /* current address */
  65.   long offset;
  66.   PSOutput copySeg;    /* copy segment - mirror */
  67.   char* buf;        /* buffer */
  68.   char* bp;        /* buffer pointer */
  69.   
  70. public:
  71.   friend TPt<TSegmentOutput>;
  72.     
  73.   TSegmentOutput(int _segNo, long _size, long _offset);
  74.   ~TSegmentOutput(){delete[] buf;}
  75.   
  76.   void Push(const char* code);
  77.   void SetAddress(long _addr){
  78.     addr=_addr - offset;    
  79.     if (copySeg()!=NULL){copySeg->SetZeroOffsetAddress(addr);}
  80.     bp=&buf[2*addr];
  81.   }
  82.   void SetZeroOffsetAddress(long zero_offset){
  83.     addr=zero_offset;
  84.     bp=&buf[2*addr];
  85.   }
  86.   void SetMirror(PSOutput& mirror_segment){
  87.     assert(mirror_segment()!=NULL);
  88.     copySeg = mirror_segment;
  89.   }
  90.   void Flush(FILE* outfd);
  91.   bool Empty(){return size==0;}
  92. };
  93.  
  94. typedef TPt<TSegmentOutput> PSOutput;
  95.  
  96.  
  97. class TObject{
  98. private:  
  99.   struct TQOperand{
  100.     char str [MAX_EQLEN];
  101.     TQOperand(const char *s){strcpy(str,s);}
  102.     TQOperand(){str[0]=0;}    
  103.     const char& operator=(const char* s){
  104.       if (s==0){str[0]=0;}else{strcpy(str,s);} return *s;}
  105.     bool operator<(TQOperand& qop){return strcmp(str,qop.str)<0;}
  106.   };
  107.   
  108.   /* Object variables */
  109.   FILE* outfd;            /* current output fd */
  110.   long oldSrcLine;
  111.   TMicroStack<long> operand_stack;
  112.   TMicroStack<TQOperand> qoperand_stack;
  113.   long obj_header_seek;
  114.   bool uAsm_exe;        /* support for old uAsm output format */
  115.   PSOutput seg_output;        /* current segment output buffer */
  116.   PSOutput seg_output_table [MAX_SEGMENTS];
  117.   TCRC crc;
  118.   
  119. private:
  120.   void CRCprintf(FILE* fd, const char* fmt, ...);    /* print and calc crc */
  121.  
  122.   void createObjHeader();
  123.   void outHeaderIndex();
  124.   void createExeHeader();  
  125.   void outAsmSource(const char *src);  
  126.   void outEndofFile();
  127.   
  128.   bool loadOperand(bool onStack, char operandType=OBJ_OPERAND_CODE);
  129.   void loadStringOperand();
  130.   void skipOperand();
  131.   long loadArgument();
  132.   void loadHeader();    /* loads header, segment info and public symbols */
  133.   void outCompiled(const char* compiled_code);
  134.   void outListing();        /* enables listing for individual source */
  135.   void CreateOutputBuffers();
  136.   void obji2objii(const char* src);
  137.   void obj2exe();
  138.     
  139. public:
  140.   TObject():oldSrcLine(0),uAsm_exe(true){}
  141.   ~TObject(){}
  142.   
  143.   void assemble(const char* outfile, const char* asm_source);
  144.   void link(const char* outfile);
  145.   
  146.   /* Object code helper functions */
  147.   /* Operand may be code operand 'o', marker 'M' */
  148.   void outOperand(const char* operand, char operandType=OBJ_OPERAND_CODE);
  149.   void outOperand(long lval, char operandType=OBJ_OPERAND_CODE);
  150.   void outStringOperand(const char *s);
  151.   void outInstruction(int instNo, bool insertRef=true);
  152.   void outKeyword(int instNo, bool insertRef=true);
  153.   void outSegment(int segNo);
  154.   void outTerminator();
  155.   
  156.   void outPCMarker(const char* marker);
  157.   void outPCMarker(long marker, int segNo=0);
  158.   void outCRef(long ref);
  159.   
  160.   void outSrcLine();
  161.   void outSrcLine(long srcLine);
  162.   
  163.   void outSymbolData();
  164.   void outSegmentData(int segInfoNo);
  165.   
  166.   void outCode(unsigned char byteC);
  167.   void outCode(unsigned int wordC);
  168.   void outCode(unsigned long longC);
  169.   
  170.   /* Translation Facilities */
  171.   long popOperand(){
  172.     assert(!operand_stack.empty()); return operand_stack.pop();}
  173.   void pushOperand(long lval){operand_stack.push(lval);}
  174.   
  175.   void pushStringOperand(const TQOperand& qop){qoperand_stack.push(qop);}
  176.   const char* popStringOperand(){
  177.     assert(!qoperand_stack.empty()); 
  178.     const TQOperand& qop = qoperand_stack.pop();
  179.     return qop.str;
  180.   }  
  181.   bool operandStacksEmpty(){
  182.     return operand_stack.empty() & qoperand_stack.empty();
  183.   }
  184. };
  185.  
  186. extern TObject object;
  187.  
  188. #endif
  189.  
  190.